package com.cool.util;

import io.jsonwebtoken.*;


import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {

    static final String SECRET = "ThisIsASecret";

    public static String generateToken(String username) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; //指定签名的时候使用的签名算法，也就是header那部分，jjwt已经将这部分内容封装好了。
        HashMap<String, Object> map = new HashMap<>();
        //you can put any data in the map
        map.put("username", username);
        long now = System.currentTimeMillis();
        String jwt = Jwts.builder()
                .setClaims(map)          //如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
                .setId(username)         //设置jti(JWT ID)：是JWT的唯一标识，根据业务需要，这个可以设置为一个不重复的值，主要用来作为一次性token,从而回避重放攻击。
                .setIssuedAt(new Date(now))           //iat: jwt的签发时间
                .setSubject(username)        //sub(Subject)：代表这个JWT的主体，即它的所有人，这个是一个json格式的字符串，可以存放什么userid，roldid之类的，作为什么用户的唯一标志。
                .signWith(signatureAlgorithm, SECRET)//设置签名使用的签名算法和签名使用的秘钥
                .setExpiration(new Date(now+1000 * 60 * 2 ))
                .compact();
        System.out.println(jwt);
        return "Bearer" + jwt; //jwt前面一般都会加Bearer
    }

    public static void validateToken(String token) {
        try {
            // parse the token.
            Claims body = Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token.replace("Bearer", ""))
                    .getBody();
            System.out.println(1111);
        } catch (ExpiredJwtException e) {
            System.out.println("token已过期" + e.getMessage());
            throw new RuntimeException(e);
        } catch (SignatureException e) {
            System.out.println("签名校验失败" + e.getMessage());
            throw new RuntimeException(e);
        } catch (Exception e) {
            System.out.println("其它错误" + e.getMessage());
            throw new RuntimeException(e);

        }
    }
}
